/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ec.tesis.prototiporecomendador.ui;

import edu.ec.tesis.prototiporecomendador.dao.GenericJpaController;
import edu.ec.tesis.prototiporecomendador.dao.exceptions.PreexistingEntityException;
import edu.ec.tesis.prototiporecomendador.dao.exceptions.RollbackFailureException;
import edu.ec.tesis.prototiporecomendador.mdl.Item;
import edu.ec.tesis.prototiporecomendador.mdl.Loging;
import edu.ec.tesis.prototiporecomendador.mdl.Movies;
import edu.ec.tesis.prototiporecomendador.mdl.Rating;
import edu.ec.tesis.prototiporecomendador.mdl.RatingPK;
import edu.ec.tesis.prototiporecomendador.ngc.Recomendadores.Semantico.RecomendadorSemantico;
import edu.ec.tesis.prototiporecomendador.ngc.UserProfile.UserProfile;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.transaction.UserTransaction;
import org.primefaces.event.RateEvent;

/**
 *
 * @author javila
 */
@ManagedBean(name = "ctrPirncipal")
@ViewScoped
public class CtrPirncipal {

    /**
     * Creates a new instance of ctrPirncipal
     */
    public CtrPirncipal() {
    }
    @Resource
    private UserTransaction utx = null;
    @PersistenceUnit(unitName = "recomendadorPU")
    private EntityManagerFactory emf = null;
    int numProgramaciones;
    int numRecomendacione;
    int algoritmo;
    int limiteEstereotipos;
    List<Item> listaPelis;
    List<Rating> listaRatings;
    Loging usuario;
    List<Item> listaParrilla;
    List<Item> listaRecomendados;
    

    GenericJpaController<Movies> controladorPeliculas;
    GenericJpaController<Rating> controladorRatings;

    private GenericJpaController<Movies> getJpaMoviesController() {
        if (controladorPeliculas == null) {
            controladorPeliculas = new GenericJpaController<Movies>(utx, emf);
        }
        return controladorPeliculas;
    }

    private GenericJpaController<Rating> getJpaRatingController() {
        if (controladorRatings == null) {
            controladorRatings = new GenericJpaController<Rating>(utx, emf);
        }
        return controladorRatings;
    }

    public List<Item> getListaPelis() {
        if (listaPelis == null) {
            listadoCompleto();
        }
        return listaPelis;
    }

    public void setListaPelis(List<Item> listaPelis) {
        this.listaPelis = listaPelis;
    }

    public int getNumProgramaciones() {
        return numProgramaciones;
    }

    public void setNumProgramaciones(int numProgramaciones) {
        this.numProgramaciones = numProgramaciones;
    }

    public int getNumRecomendacione() {
        return numRecomendacione;
    }

    public void setNumRecomendacione(int numRecomendacione) {
        this.numRecomendacione = numRecomendacione;
    }

    public int getAlgoritmo() {
        return algoritmo;
    }

    public void setAlgoritmo(int algoritmo) {
        this.algoritmo = algoritmo;
    }

    public int getLimiteEstereotipos() {
        return limiteEstereotipos;
    }

    public void setLimiteEstereotipos(int limiteEstereotipos) {
        this.limiteEstereotipos = limiteEstereotipos;
    }

    public List<Item> getListaParrilla() {
        if(listaParrilla==null)
            listaParrilla= new ArrayList<Item>();
        return listaParrilla;
    }

    public void setListaParrilla(List<Item> listaParrilla) {
        this.listaParrilla = listaParrilla;
    }

    public List<Item> getListaRecomendados() {
        if(listaRecomendados==null)
            listaRecomendados = new ArrayList<Item>();
        return listaRecomendados;
    }

    public void setListaRecomendados(List<Item> listaRecomendados) {
        this.listaRecomendados = listaRecomendados;
    }

    
    
    public void generarParrilla()
    {
        listadoCompleto();
        listaParrilla = new ArrayList<Item>();
        while(listaParrilla.size()<numProgramaciones)
        {
            int numPeli = (int)Math.round(Math.random()*59d)+1;
            Item item=listaPelis.get(numPeli);
            if(!listaParrilla.contains(item))
                listaParrilla.add(item);
        }
    }
    
    public void listadoCompleto() {
        listaPelis = new ArrayList<Item>();
        List<Movies> peliculas = getJpaMoviesController().findEntities(new Movies(),"o.idMovie>=3953");
        for (Movies peli : peliculas) {
            Item item = new Item();
            item.setItemId(peli.getIdMovie());
            item.setIntemDesc(peli.getTitulo());
            item.setIntemGenre(peli.getGeneros());
            item.setRating(buscaRating(peli.getIdMovie().intValue()));
            listaPelis.add(item);
        }
    }

    private int buscaRating(int idPeli) {
        if (listaRatings == null || listaRatings.isEmpty()) {
            listaRatings = getJpaRatingController().findEntities(new Rating(), "o.user.idUser=" + usuario.getIdUser().getIdUser().intValue());
        }
        for (Rating rating : listaRatings) {
            if (rating.getMovies().getIdMovie().intValue() == idPeli) {
                return rating.getRating().intValue();
            }
        }
        return 0;
    }

    public void buscaSoloCalificadas() {
        listaRatings = getJpaRatingController().findEntities(new Rating(), "o.user.idUser=" + usuario.getIdUser().getIdUser().intValue());
        listaPelis = new ArrayList<Item>();
        for (Rating rating : listaRatings) {
            Item item = new Item();
            item.setItemId(rating.getMovies().getIdMovie());
            item.setIntemDesc(rating.getMovies().getTitulo());
            item.setIntemGenre(rating.getMovies().getGeneros());
            item.setRating(rating.getRating());
            listaPelis.add(item);
        }
    }

    public Loging getUsuario() {
        if (usuario == null) {
            if (CtrLoginControlador.getInstance().getEstaLogueado()) {
                usuario = CtrLoginControlador.getInstance().getUsuario();
                //  listaRatings = usuario.getIdUser().getRatingList();
            } else {
                usuario = new Loging("NoLogueado");
            }
        }
        return usuario;
    }

    public void registraRating(Item peli) {
        Rating rating = new Rating(new RatingPK(usuario.getIdUser().getIdUser().intValue(), peli.getItemId()));
        rating.setRating(peli.getRating());
        try {
            getJpaRatingController().edit(rating);
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(CtrPirncipal.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackFailureException ex) {
            Logger.getLogger(CtrPirncipal.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(CtrPirncipal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void crearPerfil()
    {
        usuario.getIdUser().setRatingList(listaRatings);
        new UserProfile().crearPerfil(usuario.getIdUser());
    }
    
    public void obtenRecomendaciones(){
        listaRecomendados= new RecomendadorSemantico().generarRecomendaciones(usuario.getIdUser().getIdUser(), listaParrilla, numRecomendacione,algoritmo);
        System.out.println("Listo 2");
        System.out.println(listaRecomendados.size());
        return;
    }

}
